package com.goods.shop.service.wxmessage;

import com.goods.shop.service.AbstractService;
import com.goods.shop.service.model.wxmessage.WxEvent;
import com.goods.shop.service.model.wxmessage.WxMsgType;
import com.goods.shop.service.model.wxmessage.WxTextModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

@Service
public class WxEventServiceImpl extends AbstractService implements WxEventService {
    @Autowired
    private WxBussinessService bussinessService;
    @Override
    public WxTextModel receiveEvent(Element root) {
        logger.info("receive.root======"+root.toString());
        WxTextModel entity=new WxTextModel();
        String toUserName = root.getElementsByTagName("ToUserName").item(0).getTextContent();
        String fromUserName = root.getElementsByTagName("FromUserName").item(0).getTextContent();
        String msgType=root.getElementsByTagName("MsgType").item(0).getTextContent();

        WxMsgType wxMsgType=WxMsgType.valueOf(msgType.toUpperCase());
        logger.info("wxMsgType==={}",wxMsgType.getName());
        entity.setFromUserName(toUserName);
        entity.setToUserName(fromUserName);
        entity.setMsgType(wxMsgType);

        switch(wxMsgType){
            case TEXT://文本消息
                String content = root.getElementsByTagName("Content").item(0).getTextContent();//用户发送的内容
                String msgId=root.getElementsByTagName("MsgId").item(0).getTextContent();//消息id，64位整型
                entity.setContent(content);
                entity.setMsgId(msgId);
                break;
            case IMAGE://图片消息
                String picUrl=root.getElementsByTagName("PicUrl").item(0).getTextContent();//图片链接（由系统生成）
                String mediaId=root.getElementsByTagName("MediaId").item(0).getTextContent();//图片消息媒体id，可以调用获取临时素材接口拉取数据。
                msgId=root.getElementsByTagName("MsgId").item(0).getTextContent();//消息id，64位整型
                entity.setPicUrl(picUrl);
                entity.setMediaId(mediaId);
                entity.setMsgId(msgId);
                break;
            case VOICE:
                mediaId=root.getElementsByTagName("MediaId").item(0).getTextContent();//图片消息媒体id，可以调用获取临时素材接口拉取数据。
                String format=root.getElementsByTagName("Format").item(0).getTextContent();//语音格式，如amr，speex等
                msgId=root.getElementsByTagName("MsgId").item(0).getTextContent();//消息id，64位整型
                entity.setMediaId(mediaId);
                entity.setFormat(format);
                entity.setMsgId(msgId);
                break;
            case VIDEO:
            case SHORTVIDEO:
                mediaId=root.getElementsByTagName("MediaId").item(0).getTextContent();//图片消息媒体id，可以调用获取临时素材接口拉取数据。
                String thumbMediaId=root.getElementsByTagName("ThumbMediaId").item(0).getTextContent();//视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据。
                msgId=root.getElementsByTagName("MsgId").item(0).getTextContent();//消息id，64位整型
                entity.setMediaId(mediaId);
                entity.setThumbMediaId(thumbMediaId);
                entity.setMsgId(msgId);
                break;
            case LOCATION://地理位置消息
                double locationX=Double.parseDouble(root.getElementsByTagName("Location_X").item(0).getTextContent());
                double locationY=Double.parseDouble(root.getElementsByTagName("Location_Y").item(0).getTextContent());
                int scale=Integer.parseInt(root.getElementsByTagName("Scale").item(0).getTextContent());
                String label=root.getElementsByTagName("Label").item(0).getTextContent();
                msgId=root.getElementsByTagName("MsgId").item(0).getTextContent();
                entity.setLocationX(locationX);
                entity.setLocationY(locationY);
                entity.setScale(scale);
                entity.setLabel(label);
                entity.setMsgId(msgId);
                break;
            case LINK://链接消息
                String title=root.getElementsByTagName("Title").item(0).getTextContent();
                String description=root.getElementsByTagName("Description").item(0).getTextContent();
                String url=root.getElementsByTagName("Url").item(0).getTextContent();
                entity.setTitle(title);
                entity.setDescription(description);
                entity.setUrl(url);
                break;
            case EVENT://对于事件消息的生成
                String event= root.getElementsByTagName("Event").item(0).getTextContent();
                WxEvent wxEvent=WxEvent.valueOf(event.toUpperCase());
                logger.info("wxEvent.source==={}",wxEvent);
                entity.setEvent(wxEvent);
                logger.info("wxEvent===={}",wxEvent.getName());
                switch(wxEvent){
                    case CLICK://自定义菜单事件
                    case VIEW://点击菜单跳转链接时的事件推送
                        String eventKey = root.getElementsByTagName("EventKey").item(0).getTextContent();
                        entity.setEventKey(eventKey);
                        break;
                    case SUBSCRIBE://关注+扫描带参数二维码事件
                    case UNSUBSCRIBE://取消关注
                        logger.info("SUBSCRIBE+UNSUBSCRIBE  事件");
                        NodeList lists=root.getElementsByTagName("EventKey");
                        if(null!=lists&&lists.getLength()>0){//扫描带参数二维码事件
                            eventKey = lists.item(0).getTextContent();//带参数的值
                            entity.setEventKey(eventKey);
                        }
                        lists=root.getElementsByTagName("Ticket");
                        if(null!=lists&&lists.getLength()>0){//二维码的ticket，可用来换取二维码图片
                            String ticket=lists.item(0).getTextContent();
                            entity.setTicket(ticket);
                        }
                        break;
                    case SCAN://用户已关注时的事件推送

                        eventKey = root.getElementsByTagName("EventKey").item(0).getTextContent();//带参数的值
                        String ticket=root.getElementsByTagName("Ticket").item(0).getTextContent();
                        logger.info("SCAN  事件,eventKey="+eventKey+",ticket="+ticket);
                        entity.setEventKey(eventKey);
                        entity.setTicket(ticket);
                        break;
                    case LOCATION:
                        double latitude=Double.parseDouble(root.getElementsByTagName("Latitude").item(0).getTextContent());//纬度
                        double longitude=Double.parseDouble(root.getElementsByTagName("Longitude").item(0).getTextContent());//经度
                        double precision= Double.parseDouble(root.getElementsByTagName("Precision").item(0).getTextContent());//地理位置精度
                        entity.setLatitude(latitude);
                        entity.setLongitude(longitude);
                        entity.setPrecision(precision);
                        break;
                    default:
                        logger.info("其他事件："+event.toUpperCase());
                        break;
                }
                break;
        }
        return entity;
    }

    @Override
    public String responseEvent(WxTextModel entity) {
        //这个增加业务的逻辑处理，根据什么规则来回复什么样的消息
        //比如，关注消息，和已经关注的，则进行不同的反馈
        WxMsgType msgType=entity.getMsgType();
        logger.info("response.entity="+entity.toString());
//        logger.info("response.msgType="+msgType.getName());
        switch(msgType){
            case EVENT://对于事件消息的生成
                switch(entity.getEvent()){
                    case SUBSCRIBE:
                        return bussinessService.generateSubscribeEvent(entity);
                    case SCAN:
                        return bussinessService.generateScanEvent(entity);
                    case LOCATION:
                        return bussinessService.generateLocationEvent(entity);
                }
                break;
            case TEXT://文本
                return bussinessService.generateTextReply(entity);
            default:
               return bussinessService.generateDefault(entity);
        }
        return "";
    }

    @Override
    public void sendMessage(WxTextModel wxModel) {

    }
}
